/*
 * Copyright (c) 2021. Moses All Right Reserved
 */

package com.moses.design_patterns.proxy.dynamic_proxy.cglib;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;

/**
 * @author Moses
 * @email shenhuohui@gmail.com
 * @date 2021/4/11 17:14
 */
public class CGLibDynamicProxy implements MethodInterceptor {

    public static Object getProxy(Object target){
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(target.getClass());
        // 设置当前类为 Callback 类，调用 Enhancer 增强类时会调用 callback.intercept
        enhancer.setCallback(new CGLibDynamicProxy());
        return enhancer.create();
    }


    /**
     * 所有代理的方法都会调用此方法而不是原始的方法
     * 原始的方法可以通过借助 method 和反射调用或者用通过 proxy 调用，后者会更快
     * @param enhancer "this", 增强后的代理类实例
     * @param method 被拦截的方法
     * @param args 参数，如果是基础类型会被转换成包装类
     * @param proxy 用来调用原始方法，可以根据需求多次调用
     */
    @Override
    public Object intercept(Object enhancer, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        System.out.println("对原有方法进行增强了。。。");
        return proxy.invokeSuper(enhancer, args);
    }
}
